package me.atbar.moonlib.util;

import com.google.gson.*;
import java.io.*;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;

/**
 * @author Administrator
 */
public class JsonUtils {

    private JsonUtils() {}

    public static JsonArray addKeyInArray(String jsonText, JsonPrimitive value) {
        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(jsonText);
        if(jsonElement.isJsonArray()) {
            JsonArray jsonArray = jsonElement.getAsJsonArray();
            jsonArray.add(value);
            return jsonArray;
        }
        return null;
    }

    private static JsonObject addKeyInObject(String jsonText, String key, JsonPrimitive value) {
        JsonParser parser = new JsonParser();
        JsonElement jsonElement = parser.parse(jsonText);
        if(jsonElement.isJsonObject()) {
            JsonObject jsonObject = jsonElement.getAsJsonObject();
            jsonObject.add(key, value);
            return jsonObject;
        }
        return null;
    }

    public static JsonElement getJsonObjectKey(String jsonText, String key) {
        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(jsonText);
        if(jsonElement.isJsonObject()) {
            JsonObject jsonObject = jsonElement.getAsJsonObject();
            return jsonObject.get(key);
        }
        return null;
    }

    public static JsonElement getJsonArrayIndex(String jsonText, int index) {
        JsonParser jsonParser = new JsonParser();
        JsonElement jsonElement = jsonParser.parse(jsonText);
        if(jsonElement.isJsonArray()) {
            JsonArray jsonArray = jsonElement.getAsJsonArray();
            return jsonArray.get(index);
        }
        return null;
    }

    public static String loadJsonFromUrl(String url) {
        StringBuilder json = new StringBuilder();
        try {
            URL urlObject = new URL(url);
            URLConnection uc = urlObject.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(uc.getInputStream(), StandardCharsets.UTF_8));
            String inputLine;
            while ((inputLine = in.readLine()) != null) {
                json.append(inputLine);
            }
            in.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return json.toString();
    }

    public static String loadJsonFromFile(String path) {
        StringBuilder str = new StringBuilder();
        File file = new File(path);
        BufferedReader reader = null;
        try{
            FileInputStream in = new FileInputStream(file);
            reader = new BufferedReader(new InputStreamReader(in, StandardCharsets.UTF_8));
            String tempString;
            while((tempString = reader.readLine())!=null){
                str.append(tempString);
            }
            reader.close();
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            if(reader != null){
                try{
                    reader.close();
                }catch(IOException ignored){
                }
            }
        }
        return jsonFormat(str.toString());
    }

    public static String jsonFormat(String jsonText) {
        int level = 0;
        StringBuilder jsonForMatStr = new StringBuilder();
        for(int index = 0; index < jsonText.length(); index++) {
            char c = jsonText.charAt(index);
            if (level > 0 && '\n' == jsonForMatStr.charAt(jsonForMatStr.length() - 1)) {
                jsonForMatStr.append(getLevelStr(level));
            }
            switch (c) {
                case '{':
                case '[':
                    jsonForMatStr.append(c).append("\n");
                    level++;
                    break;
                case ',':
                    jsonForMatStr.append(c).append("\n");
                    break;
                case '}':
                case ']':
                    jsonForMatStr.append("\n");
                    level--;
                    jsonForMatStr.append(getLevelStr(level));
                    jsonForMatStr.append(c);
                    break;
                default:
                    jsonForMatStr.append(c);
                    break;
            }
        }
        return jsonForMatStr.toString();
    }

    private static String getLevelStr(int level) {
        StringBuilder levelStr = new StringBuilder();
        for (int levelI = 0; levelI < level; levelI++) {
            levelStr.append("\t");
        }
        return levelStr.toString();
    }

}
